﻿// 1397. 字母游戏.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>


/*
https://www.acwing.com/problem/content/1399/

字母游戏在家用电视机上广泛流行。

在该游戏的其中一个版本中，每个字母都有一个分值，如下图所示：

lgame.gif

你需要收集一些字母，并用这些字母拼成一个或多个单词。

拼单词时，一个字母收集了多少个，那么拼的时候就能用多少个，不能多用。

如果只拼出一个单词，那么这个单词的所有字母对应分值相加，就是你的得分。

如果拼出多个单词，那么这些单词的分值相加就是你的得分。

你需要尽可能的使自己的得分达到最高。

我们将提供一个单词列表，只有在列表中出现过的单词才是有效单词。

输入格式
第一行，包含一个小写字母构成的字符串（长度 3∼7)，表示你收集到的字母。

接下来若干行，用来描述单词列表，每行包含一个单词，最后一行为一个 “.” 表示输入结束。

单词由小写字母构成，长度 3∼7。

单词列表中的单词，保证没有重复，并且按照字典序排列。

输出格式
第一行输出一个整数，表示最高得分。

接下来若干行，输出所有可以获得最高得分的单词拼法，每行一个。

由给定字母的个数，以及所有列表中单词的长度范围，可以很容易看出，给定字母只能拼出 1∼2 个列表中的单词。

所以，在输出时，应按照字典序排序，先按第一个单词排序，第一个单词相同时，按第二个单词排序。

当能够拼成两个单词时，这两个单词应按照字典序排序，组成单词对。

单词对中的两个单词可以相同。

数据范围
单词列表中单词的数量不超过 40000 个。

输入样例：
prmgroa
profile
program
prom
rag
ram
rom
.
输出样例：
24
program
prom rag
*/
int main()
{
    std::cout << "Hello World!\n";
}

 